package middleware

import (
	"gin-mvc/pkg/exceptions"
	"github.com/gin-gonic/gin"
	"net/http"
)

func Recover() gin.HandlerFunc {
	return func(c *gin.Context) {
		defer func() {
			if r := recover(); r != nil {
				//封装通用json返回
				//c.JSON(http.StatusOK, Result.Fail(errorToString(r)))
				//Result.Fail不是本例的重点，因此用下面代码代替
				c.JSON(http.StatusOK, gin.H{
					"code":    exceptions.Error,
					"message": errorToString(r),
				})
				//终止后续接口调用，不加的话recover到异常后，还会继续执行接口里后续代码
				c.Abort()
			}
		}()
		//加载完 defer recover，继续后续接口调用
		c.Next()
	}
}

// recover错误，转string
func errorToString(r interface{}) string {
	switch v := r.(type) {
	case error:
		return v.Error()
	default:
		return r.(string)
	}
}
